package la.iok.hzsvn.lewin.movie.cloud.service;

import la.iok.hzsvn.lewin.movie.cloud.entity.Device;
import la.iok.hzsvn.lewin.movie.cloud.model.DeviceParam;
import la.iok.hzsvn.lewin.movie.core.Token;
import la.iok.hzsvn.lewin.movie.core.model.DeviceVo;
import la.iok.hzsvn.lewin.mybatis.model.PageVo;
import la.iok.hzsvn.lewin.mybatis.service.BaseService;
import la.iok.hzsvn.share.annotations.NotNull;
import la.iok.hzsvn.share.annotations.Nullable;

public interface DeviceService extends BaseService<Device,Long> {
    /**
     * 保存设备
     * @param token 操作用户
     * @param device 设备信息
     * @return 新插入的设备id
     */
    @NotNull
    Long save(@NotNull Token token, @NotNull DeviceParam device);

    /**
     * 通过扫描二维码注册设备
     * @param token 操作用户
     * @param device 设备信息
     * @return 新插入的设备id
     */
    Long qrCodeSave(@NotNull Token token, @NotNull DeviceParam device);

    /**
     * 根据设备码查找设备
     * @param code 设备码
     * @return 设备
     */
    @Nullable
    Device select(@Nullable String code);

    /**
     * 更新名称或者房间id或者组织id
     * @param token 操作用户
     * @param id 设备id
     * @param name 名称
     * @param roomId 房间id，可能为0，表示不属于任何房间
     * @param orgUnitId 组织id.只有管理员才能修改，并且修改的时候一定要同时修改房间id
     */
    void update(@NotNull Token token,@Nullable Long id, @Nullable String name,@Nullable Long roomId,@Nullable Long orgUnitId);

    /**
     * 验证权限并删除设备
     * @param token 操作用户
     * @param id 设备id
     */
    void delete(@NotNull Token token, @Nullable Long id);

    /**
     * 分页查询设备
     * @param page 页号
     * @param limit 分页大小
     * @param token 操作用户,根据权限查询
     * @param orgUnitId 组织id,如果非空则只查询此组织的设备
     * @param roomId 房间id,如果非空则只查询此房间的设备
     * @param name 设备名称模糊过滤
     * @return 分页设备记录
     */
    PageVo<DeviceVo> page(int page, int limit, @NotNull Token token, @Nullable Long orgUnitId, Long roomId, @Nullable String name);

    @Nullable
    DeviceVo po2vo(@Nullable Device entity);
}
